package com.suning.sawp.service.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.annotation.Resource;

import org.apache.commons.io.IOUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 异业券上传工具类
 * @author 15050519
 *
 */
@Component
public class UploadCouponFileUtil {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(UploadCouponFileUtil.class);
    
    /**
     * 应用服务器上的临时文件存放目录
     */
    @Value("#{settingConfig['localTempFileDirPath']}")
    private String tmpdir;
    
    @Resource(name="ftpUtil")
    FtpClientUtil ftpUtil;
    
    /**
     * 根据数据,生成文件并上传静态服务器
     * @param couponList
     * @param couponHead
     * @param activityId
     * @return 服务器资源地址
     */
    public String createFileAndUpload(Set<String> couponList, String couponHead, String activityId) {
        //将文件夹分隔符转换成系统分隔符
        String tempDir = tmpdir.replace("\\", File.separator).replace("/", File.separator);
        
        //异步处理生成文件
        String[] titles = new String[]{"序列", "券号"};
        List<String[]> datas = new ArrayList<String[]>();
        //转换成迭代器
        Iterator<String> couponIt = couponList.iterator();
        String[] data = null;
        int dataOrder = 1;
        int fileOrder = 1;
        //临时文件目录,以活动ID生成子目录
        String base = tempDir + File.separator + activityId;
        //文件夹对象
        File directory = new File(base);
        File zip = null;
        try {
            //判断文件夹是否存在,不存在则新建
            if (!directory.exists()) {
                directory.mkdirs();
            }
            //循环数据,将数据写进文件中
            while (null != couponIt && couponIt.hasNext()) {
                data = new String[2];
                //序列
                data[0] = dataOrder + "";
                //随机券号
                data[1] = couponHead + couponIt.next();
                datas.add(data);
                dataOrder ++;
                //判断是否限定
                if (dataOrder > 20000) {
                    //将数据写入临时文件
                    createTempFile(titles, datas, "part-" + fileOrder + "-", directory);
                    //写完一个文件,序值重新从1开始计数
                    dataOrder = 1;
                    //文件的序值+1
                    fileOrder ++;
                    //数据清空
                    datas.clear();
                }
            }
            //结束循环, 判断集合中是否存在数据, 存在则继续生产文件
            if (datas.size() >0) {
                createTempFile(titles, datas, "part-" + fileOrder + "-", directory);
                datas.clear();
            }
            //将生成的文件打车zip压缩文件
            try {
                ZipUtil.zip(base, tempDir, activityId + ".zip");
            } catch (Exception e) {
                LOGGER.error("ZipUtil.zip error,", e);
            } 
            //生成的zip文件
            zip = new File(tempDir + File.separator + activityId + ".zip");
            //存在则上传
            if (zip.exists()) {
                //上传至目标目录
                return ftpUtil.upload("coupon/", zip, activityId + ".zip", false);
            }
        } catch (Exception e) {
            LOGGER.error("createFileAndUpload error,", e);
        } finally {
            //删除临时文件夹,文件
            deleteFile(directory);
            deleteFile(zip);
        }        
        return null;
    }
    
    /**
     * 删除文件,包含文件夹
     * @param file
     */
    public static void deleteFile(File file) {
        if (null != file) {
            //判断是否是文件夹
            if (file.isDirectory()) {
                File[] files = file.listFiles();
                if (null != files && files.length >0) {
                    //循环子文件,文件夹
                    for (File childFile : files) {
                        //迭代删除子文件,文件夹
                        deleteFile(childFile);
                    }
                }
                //文件夹为空时,执行删除
                file.delete();
            } else {
                //文件直接进行删除
                file.delete();
            }
        }
    }
    
    /**
     * 根据数据生成excel临时文件
     * @param titles
     * @param datas
     * @param prefix
     * @param suffix
     * @param directory
     */
    public void createTempFile(String[] titles, List<String[]> datas, String prefix, File directory) {
        FileOutputStream output = null;
        try {
            //将数据以excel格式写进workbook对象中
            Workbook workbook = ExcelUtils.createExcel(datas, titles);
            //设置第一个sheet名称
            workbook.setSheetName(0, "异业券");
            //在指定的目录, 生成excel表格的临时文件
            File temp = File.createTempFile(prefix, ".xlsx", directory);
            output = new FileOutputStream(temp);
            workbook.write(output);
        } catch (IOException e) {
            LOGGER.error("createTempFile error,", e);
        } finally {
            //关闭流
            IOUtils.closeQuietly(output);
        }
    }
}
